package com.qgs.rabbitmqapi.message;

import com.rabbitmq.client.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;

/**
 * @Author: 蔡翔
 * @Date: 2019/7/15 13:29
 * @Version 1.0
 */

public class Consumer {
    public static void main(String[] args) throws Exception {

        Logger logger = LoggerFactory.getLogger(Consumer.class);

        //1.创建一个ConnectionFactory,并进行配置
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.0.229"); //直接填地址不要 http://192.168.0.229
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/");

        //2.通过连接工厂创建连接
        Connection connection = connectionFactory.newConnection();

        //3.通过connection创建一个Channel
        Channel channel = connection.createChannel();

        //4.声明（创建）一个队列,各个参数的含义点进去就行了。
        // exclusive是独占的意思（比如说顺序消费场景下还是有必要的），独占的意思是这个队列只有我这个channel能够去监听去消费，其他的channel不能去连接
        // autoDelete 是如果这个队列没有与Exchange有一个关联，那么这个队列自动删除
        String queueName = "test01";
        channel.queueDeclare(queueName,true,false,false,null);

        //5.创建消费者
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
            @Override   //这里DefaultConsumer 有一个好处就是会自动监听队列的里面的所有数据而不是 nextDelivery()
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                super.handleDelivery(consumerTag, envelope, properties, body);
                String messgae = new String(body,"UTF-8");
                logger.info("客户端接收到的数据是："+messgae);
                logger.info("propertys-headers()"+properties.getHeaders()); //这里的header 是我们put进去的一对对键值对，可以存一些任务信息。
                logger.info("propertys-getContentEncoding()"+properties.getContentEncoding());
                logger.info("propertys-getExpiration()"+properties.getExpiration());
                /*logger.info("consumerTag："+consumerTag);
                logger.info("properties："+properties);
                logger.info("envelope："+envelope); */
            }
        };


        //6.设置channel
        //basicConsume(String queue, boolean autoAck, Consumer callback);ack是当客户端取到一条message后会回送给broker一条信息表明收到，
        // autoAck表明自动签收；callback 就是具体的消费者对象了
        channel.basicConsume(queueName,true,defaultConsumer);



    }

}
